package com.tracy.life.discovery.goods.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by ZJS on 2016/7/20.
 */
public class KeyWordsView extends ViewGroup {
    private List<List<View>> mListAll;//通过onMeasure方法得到这样的数据源
    private List<Integer> list;

    public KeyWordsView(Context context) {
        super(context);
        init();
    }

    public KeyWordsView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {//初始化数据源
        mListAll = new ArrayList<List<View>>();
        list = new ArrayList<Integer>();
    }

    public KeyWordsView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        //设置对应坐标位置
        int left = 0,right =0,top=0,bottom=0;
        for (int i = 0; i <mListAll.size() ; i++) {
            List<View> rowChild = mListAll.get(i);//取一行的View
            for (int j=0;j<rowChild.size();j++){
                View child = rowChild.get(j);//取单个View

                right = left+child.getMeasuredWidth();
                bottom = top+child.getMeasuredHeight();
                child.layout(left,top,right,bottom);//放置child的核心方法

                //同行下一次左上角的点为上一个右上角的点
                left = right;//给下一个用
            }
            //换行，top的值是上一行的最大高度，要记录每一行的最大高度
            top += list.get(i);
            left = 0;

        }

    }

    /*
    * 1.match_parent或定值可以直接测量
    * 2.wrap_context要重新测
    * */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        mListAll.clear();//防止onMeasure反复调用，只保留最后一次数据

        //传递的入参是组合值
        //widthMeasureSpec（宽度mode+宽度大小）
        //heightMeasureSpec（高度mode+高度大小）
        //获取mode
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);//提取模式
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);//提取大小
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
        //Mode有三种
        //MeasureSpec.UNSPECIFIED（系统最外层dectorView使用的FrameLayout使用的）
        //MeasureSpec.AT_MOST(给wrap_content使用的模式)
        //MeasureSpec.EXACTLY(给match_parent或固定值使用的模式)

        //在AT_MOST模式下，获得的宽度或高度不一定是实际想要的，需要自己测量

        //在流布局中：如果宽度自适应，取最大一行的宽度
        //如果高度自适应，每一行child高度累加作为自适应高度，每一行高度自身高度取child最大值
        //自动换行：不能比系统测出的widthSize大，超过需考虑换行

        int wrapWidth = 0, wrapHeight = 0;
        int lineWidth = 0, lineHeight = 0;

        //获取容器中存放child的个数
        int cCount = getChildCount();

        List<View> childList = new ArrayList<View>();
        for (int i = 0; i <cCount ; i++) {
            View child = getChildAt(i);

            //获取宽度和高度
            //第一个参数：需要测的child，第二个：宽度和高度的MeasureSpec
            measureChild(child,widthMeasureSpec,heightMeasureSpec);
            int childWidth = child.getMeasuredWidth();
            int childHeight = child.getMeasuredHeight();

            if(lineWidth+childWidth<=widthSize){
//                Log.i("zjs","lineWidth===>"+lineWidth);
//                Log.i("zjs","childHeight===>"+childHeight);
//                Log.i("zjs","lineWidth+childHeight===>"+(lineWidth+childHeight));
//                Log.i("zjs","widthSize===>"+widthSize);

                //不换行的逻辑
                childList.add(child);
                lineWidth +=childWidth;//行宽为child累加
                lineHeight = Math.max(childHeight,lineHeight);//取最大值作为行高

            }else{
                //换行的逻辑
                mListAll.add(childList);//上面一行加进去
                childList = new ArrayList<View>();//再new一个list
                childList.add(child);//加到新的childList里面



                wrapWidth = Math.max(lineWidth,wrapWidth);//自适应宽度取本行和原来自适应宽度的最大值
                wrapHeight += lineHeight;//自适应高度等于累加行高；
                //下一行的情况，记录的是上一行的的内容，计算出自适应宽度和高度
                list.add(lineHeight);//记录每一行高度

                lineWidth = childWidth;
                lineHeight = childHeight;//记录数据，开始下一次循环
            }
            if (i==cCount-1){//最后一个控件加完后
                mListAll.add(childList);
                wrapWidth = Math.max(lineHeight,wrapWidth);
                wrapHeight +=lineHeight;
                list.add(lineHeight);//记录每一行高度
            }
        }

        //通过mode再去确认使用wrapWidth和wrapHeight的情况
        //lastWidth,lastHeight(最终确认的宽度和高度)
        int lastWidth = widthMode==MeasureSpec.AT_MOST? wrapWidth : widthSize;
        int lastHeight = heightMode==MeasureSpec.AT_MOST? wrapHeight : heightSize;

        setMeasuredDimension(lastWidth,lastHeight);
    }
}
